<?php
/**
 * 文件代理脚本 - 解决 CORS 跨域问题
 * 
 * 用途：代理获取远程文件，绕过浏览器的 CORS 限制
 * 使用：/proxy.php?url=https://example.com/file.pptx
 */

// 设置错误报告
error_reporting(E_ALL);
ini_set('display_errors', 0);

// 设置超时时间（秒）
set_time_limit(300);

// 允许跨域访问（重要！）
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: *');

// 处理 OPTIONS 预检请求
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit();
}

// 获取目标 URL
$targetUrl = isset($_GET['url']) ? $_GET['url'] : '';

// 验证 URL
if (empty($targetUrl)) {
    http_response_code(400);
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode([
        'error' => true,
        'message' => '缺少 url 参数'
    ], JSON_UNESCAPED_UNICODE);
    exit();
}

// 验证 URL 格式
if (!filter_var($targetUrl, FILTER_VALIDATE_URL)) {
    http_response_code(400);
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode([
        'error' => true,
        'message' => '无效的 URL 格式'
    ], JSON_UNESCAPED_UNICODE);
    exit();
}

// 安全检查：只允许 http 和 https 协议
$urlParts = parse_url($targetUrl);
if (!in_array($urlParts['scheme'], ['http', 'https'])) {
    http_response_code(400);
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode([
        'error' => true,
        'message' => '只支持 HTTP/HTTPS 协议'
    ], JSON_UNESCAPED_UNICODE);
    exit();
}

// 可选：白名单限制（取消注释以启用）
/*
$allowedDomains = [
    'static.thankmm.com',
    'example.com',
    'cdn.example.com'
];

if (!in_array($urlParts['host'], $allowedDomains)) {
    http_response_code(403);
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode([
        'error' => true,
        'message' => '该域名不在允许列表中'
    ], JSON_UNESCAPED_UNICODE);
    exit();
}
*/

// 根据目标域名动态设置 REFERER
// 可以配置特定域名的 REFERER，未配置的域名使用目标域名本身
$refererMap = [
    // 示例：为特定域名设置自定义 REFERER
    // 'static.thankmm.com' => 'https://www.thankmm.com/',
    // 'cdn.example.com' => 'https://www.example.com/',
];

// 确定使用的 REFERER
$referer = '';
if (isset($refererMap[$urlParts['host']])) {
    // 使用配置的 REFERER
    $referer = $refererMap[$urlParts['host']];
} else {
    // 默认使用目标域名的根路径作为 REFERER
    $scheme = isset($urlParts['scheme']) ? $urlParts['scheme'] : 'https';
    $referer = $scheme . '://' . $urlParts['host'] . '/';
}

try {
    // 初始化 cURL
    $ch = curl_init();
    
    // 设置 cURL 选项
    curl_setopt_array($ch, [
        CURLOPT_URL => $targetUrl,
        CURLOPT_REFERER => $referer,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,      // 跟随重定向
        CURLOPT_MAXREDIRS => 5,              // 最多 5 次重定向
        CURLOPT_TIMEOUT => 60,               // 超时时间
        CURLOPT_SSL_VERIFYPEER => true,      // 验证 SSL 证书
        CURLOPT_SSL_VERIFYHOST => 2,
        CURLOPT_ENCODING => '',              // 支持压缩
        CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        CURLOPT_HEADERFUNCTION => function($curl, $header) {
            // 转发部分响应头
            $len = strlen($header);
            $header = explode(':', $header, 2);
            
            if (count($header) < 2) {
                return $len;
            }
            
            $headerName = strtolower(trim($header[0]));
            $headerValue = trim($header[1]);
            
            // 转发这些响应头
            $allowedHeaders = [
                'content-type',
                'content-length',
                'content-disposition',
                'last-modified',
                'etag',
                'cache-control'
            ];
            
            if (in_array($headerName, $allowedHeaders)) {
                header($headerName . ': ' . $headerValue);
            }
            
            return $len;
        }
    ]);
    
    // 执行请求
    $response = curl_exec($ch);
    
    // 检查错误
    if ($response === false) {
        $error = curl_error($ch);
        $errno = curl_errno($ch);
        curl_close($ch);
        
        http_response_code(502);
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode([
            'error' => true,
            'message' => '无法获取远程文件: ' . $error,
            'errno' => $errno
        ], JSON_UNESCAPED_UNICODE);
        exit();
    }
    
    // 获取 HTTP 状态码
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    // 关闭 cURL
    curl_close($ch);
    
    // 检查 HTTP 状态码
    if ($httpCode >= 400) {
        http_response_code($httpCode);
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode([
            'error' => true,
            'message' => '远程服务器返回错误',
            'httpCode' => $httpCode
        ], JSON_UNESCAPED_UNICODE);
        exit();
    }
    
    // 输出文件内容
    echo $response;
    
} catch (Exception $e) {
    http_response_code(500);
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode([
        'error' => true,
        'message' => '服务器内部错误: ' . $e->getMessage()
    ], JSON_UNESCAPED_UNICODE);
}

